tg-me.com/pythonl/4824
Last Update:
🐍 Задача с подвохом: mutable default arguments в Python
🔹 Уровень: Advanced
🔹 Темы: изменяемые аргументы по умолчанию, функции, ловушки с list
и dict
📌 Условие
Что выведет следующий код?
def append_to_list(value, my_list=[]):
my_list.append(value)
return my_list
print(append_to_list(1))
print(append_to_list(2))
print(append_to_list(3))
❓ Вопросы
1. Почему результат выглядит неожиданно?
2. Как исправить это поведение?
3. Когда стоит использовать изменяемые аргументы по умолчанию — если вообще стоит?
🔍 Разбор
✅ Ожидаемый вывод:
[1]
[1, 2]
[1, 2, 3]
🔧 Почему так происходит
- Аргументы по умолчанию вычисляются один раз — во время определения функции, а не при каждом вызове.
- Значение
my_list=[]
создаётся один раз и затем используется повторно при всех вызовах.- Все вызовы
append_to_list
изменяют один и тот же список.⚠️ Подвох
Это один из самых коварных багов в Python, особенно среди начинающих — кажется, что
my_list
должен быть новым на каждый вызов, но это не так.🧠 Вывод
- Никогда не используй изменяемые типы (list, dict, set) как значения по умолчанию.
- Вместо этого используй
None
и создавай новый объект вручную:
def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list
✅ Тогда вывод будет:
[1]
[2]
[3]
📌 Это правило относится ко всем изменяемым типам:
[]
, {}
, set()
и кастомные классы.BY Python/ django
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/pythonl/4824